package com.yf.bean;

import com.yf.utils.Utils;
import lombok.Data;
import org.apache.commons.codec.binary.Base64;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Data
public class ExamBean {
    Long id;
    String year;
    Integer number;
    String question;
    String tag;
    String answer;
    String type;
    String subject;
    String choice;
    Integer valid;
    Long try_;
    Short acc;
    Integer uid;

    public boolean validate() {
        if (Utils.isNullOrEmpty(question) || question.length() > 2048) {
            return false;
        }

        if (Utils.isNullOrEmpty(tag) || tag.length() > 128) {
            return false;
        }

        if (Utils.isNullOrEmpty(subject) || subject.length() > 64) {
            return false;
        }

//        if (year == null || year.length() != 4) {
//            return false;
//        }
//
//        if (number == null || number < 0) {
//            return false;
//        }
        return true;
    }
    public Map<String, String> encode(int m) {
        return Utils.encodeObj(m, ExamBean.class, this);
    }
//    public Map<String, String> encode(int m) {
//        byte l1 = (byte) (m & 0xFF);
//        byte l2 = (byte) ((m >> 8) & 0xFF);
//        byte l3 = (byte) ((m >> 16) & 0xFF);
//        byte l4 = (byte) ((m >> 24) & 0xFF);
//
//        Class<ExamBean> clz = ExamBean.class;
//        StringBuilder header = new StringBuilder(64);
//        List<Byte> buff = new ArrayList<>(256);
//        final Field[] fields = clz.getDeclaredFields();
//        for (Field f: fields) {
//            final Class<?> type = f.getType();
//            try {
//                Object o = f.get(this);
//                if (o == null) {
//                    continue;
//                }
//                String v;
//                if (type.equals(String.class)) {
//                    v = (String) o;
//                } else if (type.equals(Integer.class)) {
//                    v = String.valueOf(o);
//                } else if (type.equals(Long.class)) {
//                    v = String.valueOf(o);
//                } else {
//                    continue;
//                }
//                if (v == null || v.length() == 0) {
//                    continue;
//                }
//                final byte[] bytes = v.getBytes();
//                header.append(String.format("%s:%d ",f.getName(), bytes.length));
//                int i = 0;
//                while (i <= bytes.length - 4) {
//                    buff.add((byte) (l1 ^ bytes[i]));
//                    buff.add((byte) (l2 ^ bytes[i+1]));
//                    buff.add((byte) (l3 ^ bytes[i+2]));
//                    buff.add((byte) (l4 ^ bytes[i+3]));
//                    i += 4;
//                }
//                while (i < bytes.length) {
//                    buff.add((byte) (l1 ^ bytes[i]));
//                    i++;
//                }
//            } catch (IllegalAccessException ignore) {
//                //
//            }
//        }
//        if (buff.size() == 0) {
//            return null;
//        }
//        byte [] buffer = new byte[buff.size()];
//        for (int i = 0; i < buff.size(); i++) {
//            buffer[i] = buff.get(i);
//        }
//        if (header.length() > 0) {
//            header.deleteCharAt(header.length() - 1);
//        }
//        Map<String, String> ret = new HashMap<>(3);
//        byte[] encodedHeader = Utils.mixData(m, 0, header.toString());
//        ret.put("rt", Base64.encodeBase64String(encodedHeader));
//        ret.put("ct", Base64.encodeBase64String(buffer));
//        ret.put("lk", Utils.encodeInt(m));
//        return ret;
//    }
}
